﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Bibilioteca.DataAccess
{
    class CuentasDao : DaoBase
    {
        public const int modoConsultaOr = 0;
        public const int modoConsultaAnd = 1;

        public int paramID;

        public string usuario;
        public string password;
        public int socioId;
        public int esAdmin;
        public int reservas;
        public int prestamos;
        public int habilitada;

        public CuentasDao()
        {
            reiniciarParams();
        }

        /*
         * Establece los valores iniciales para los parametros.
         */
        private void reiniciarParams()
        {
            paramID = -1;
            usuario = "";
            password = "";
            socioId = -1;
            esAdmin = -1;
            reservas = -1;
            prestamos = -1;
            habilitada = -1;
        }


        /*
         * Retorna un DataTable con todos los cuentas y todos los campos
         * asociados a ellos.
         */
        public DataTable todosLosCuentas()
        {
            string sql = "SELECT * FROM cuentas";
            return EjecutarQuery(sql);
        }


        /*
         * Dado un numero de cuenta, lo retorna.
         */
        public DataTable GetCuentaNumero()
        {
            string sql = "SELECT * FROM cuentas s where s.cuenta_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }

        /*
         * Dado id de socio, retorna la cuenta.
         */
        public DataTable GetCuentaDeSocio()
        {
            string sql = "SELECT * FROM cuentas s where s.cuenta_socio_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, socioId) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }

        /*
         * Dado un username retorna la cuenta.
         * PARA EL LOGIN
         */
        public DataTable GetCuentaDeUser()
        {
            string sql = "SELECT * FROM cuentas s where s.cuenta_user = @user";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("user", SqlDbType.VarChar, usuario) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        /*
         * Busca los cuentas segun filtros generados.
         * Modo puede ser modoConsultaOr o modoConsultaAnd.
         * modoUpdate o modoInsert no se usan aca.
         */
        public DataTable GetCuentaFiltros(int modo)
        {
            string separador = " or "; //Consulta por defecto tipo OR.
            if (modo == 0) separador = " or ";
            else if (modo == 1) separador = " and ";

            string sql = "SELECT * FROM cuentas where ";

            bool primerParam = true; //Soy el primer parametro? sino me debe anteceder un AND o un OR

            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            if (paramID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_id = @cuenta_id ";
                parametrosList.AddLast(new DbParameter("cuenta_id", SqlDbType.Int, paramID));
            }

            if (usuario.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_user like '%' + @cuenta_user ";
                parametrosList.AddLast(new DbParameter("cuenta_user", SqlDbType.VarChar, usuario));
            }

            if (password.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_pass like '%' + @cuenta_pass ";
                parametrosList.AddLast(new DbParameter("cuenta_pass", SqlDbType.VarChar, password));
            }

            if (esAdmin != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_esAdmin = @cuenta_esAdmin ";
                parametrosList.AddLast(new DbParameter("cuenta_esAdmin", SqlDbType.Bit, esAdmin));
            }

            if (socioId != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_socio_id like '%' + @cuenta_socio_id ";
                parametrosList.AddLast(new DbParameter("cuenta_socio_id", SqlDbType.VarChar, socioId));
            }

            if (reservas != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_reservasActivas = @cuenta_reservasActivas ";
                parametrosList.AddLast(new DbParameter("cuenta_reservasActivas", SqlDbType.SmallInt, reservas));
            }

            if (prestamos != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_prestamosActivos = @cuenta_prestamosActivos ";
                parametrosList.AddLast(new DbParameter("cuenta_prestamosActivos", SqlDbType.SmallInt, prestamos));
            }

            if (habilitada != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " cuenta_habilitada = @cuenta_habilitada ";
                parametrosList.AddLast(new DbParameter("cuenta_habilitada", SqlDbType.Bit, habilitada));
            }

            sql += "; ";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            DataTable retorno = new DataTable();

            if (parametrosList.Count > 0)
                retorno = EjecutarQuery(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;

        }


        public void insertarCuenta()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            string sql = "INSERT INTO cuentas ( ";
            string sqlParametros = "";

            if (usuario.Length > 1)
            {
                sql += "cuenta_user "; sqlParametros += " @cuenta_user";
                parametrosList.AddLast(new DbParameter("cuenta_user", SqlDbType.VarChar, usuario));
            }

            if (password.Length > 1)
            {
                sql += ",cuenta_pass "; sqlParametros += ", @cuenta_pass";
                parametrosList.AddLast(new DbParameter("cuenta_pass", SqlDbType.VarChar, password));
            }

            if (esAdmin != -1)
            {
                sql += ",cuenta_esAdmin "; sqlParametros += ", @cuenta_esAdmin";
                parametrosList.AddLast(new DbParameter("cuenta_esAdmin", SqlDbType.Bit, esAdmin));
            }

            if (socioId != -1)
            {
                sql += ",cuenta_socio_id "; sqlParametros += ", @cuenta_socio_id";
                parametrosList.AddLast(new DbParameter("cuenta_socio_id", SqlDbType.Int, socioId));
            }

            if (reservas != -1)
            {
                sql += ",cuenta_reservasActivas "; sqlParametros += ", @cuenta_reservasActivas";
                parametrosList.AddLast(new DbParameter("cuenta_reservasActivas", SqlDbType.SmallInt, reservas));
            }

            if (prestamos != -1)
            {
                sql += ",cuenta_prestamosActivos "; sqlParametros += ", @cuenta_prestamosActivos";
                parametrosList.AddLast(new DbParameter("cuenta_prestamosActivos", SqlDbType.SmallInt, prestamos));
            }

            if (habilitada != -1)
            {
                sql += ",cuenta_habilitada "; sqlParametros += ", @cuenta_habilitada";
                parametrosList.AddLast(new DbParameter("cuenta_habilitada", SqlDbType.Bit, habilitada));
            }

            sql += ") VALUES ( " + sqlParametros + ")";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1); //Se puede usar tb la variable sql que es la consulta tradicional
            //sql2 hace referencia al store procedure.

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void modificarCuenta()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            bool primerParam = true;

            string sql = "UPDATE cuentas SET ";

            if (usuario.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_user = @cuenta_user";
                parametrosList.AddLast(new DbParameter("cuenta_user", SqlDbType.VarChar, usuario));
            }

            if (password.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_pass = @cuenta_pass";
                parametrosList.AddLast(new DbParameter("cuenta_pass", SqlDbType.VarChar, password));
            }

            if (esAdmin != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_esAdmin = @cuenta_esAdmin ";
                parametrosList.AddLast(new DbParameter("cuenta_esAdmin", SqlDbType.Bit, esAdmin));
            }

            if (socioId != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_socio_id = @cuenta_socio_id";
                parametrosList.AddLast(new DbParameter("cuenta_socio_id", SqlDbType.Int, socioId));
            }

            if (reservas != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_reservasActivas  =  @cuenta_reservasActivas";
                parametrosList.AddLast(new DbParameter("cuenta_reservasActivas", SqlDbType.SmallInt, reservas));
            }

            if (prestamos != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_prestamosActivos  =  @cuenta_prestamosActivos";
                parametrosList.AddLast(new DbParameter("cuenta_prestamosActivos", SqlDbType.SmallInt, prestamos));
            }

            if (habilitada != -1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "cuenta_habilitada = @cuenta_habilitada";
                parametrosList.AddLast(new DbParameter("cuenta_habilitada", SqlDbType.Bit, habilitada));
            }

            sql += " WHERE cuenta_id = @cuenta_id";

            parametrosList.AddLast(new DbParameter("cuenta_id", SqlDbType.Int, paramID));

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void eliminarCuenta()
        {
            if (paramID != -1)
            {
                string sql = "DELETE FROM cuentas where cuenta_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });

                reiniciarParams();
            }

        }
    }
}
